package org.scub.foundation.fournisseur.egicom.core.dao.implementations;

import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.scub.foundation.fournisseur.egicom.core.dao.interfaces.ProduitDao;
//import org.scub.foundation.fournisseur.egicom.core.dto.ProduitCriteresRechercheDto;
import org.scub.foundation.fournisseur.egicom.core.model.Produit;
import org.scub.foundation.framework.base.paging.RemotePagingCriteriasDto;
import org.scub.foundation.framework.base.paging.RemotePagingSortDto;
import org.scub.foundation.framework.core.dao.implementations.HibernateDaoBaseImplementation;

/**
 * Implémentation de l'interface ProduitDao.
 * @author Adrien HAUTOT (adrien.hautot@scub.net)
 */
public class ProduitDaoImpl extends HibernateDaoBaseImplementation implements ProduitDao {

    private static final String POURCENT = "%";

    /**
     * {@inheritDoc}
     */
    @Override
    public void createProduit(Produit produit) {
        save(produit);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void deleteProduit(Produit produit) {
        delete(produit);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<Produit> getAllProduits() {
        return loadAll(Produit.class);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Produit getProduitById(Long idProduit) {
        return load(idProduit, Produit.class);
    }

    /**
     * {@inheritDoc}
     */
  //  @SuppressWarnings("unchecked")
  //  @Override
  //  public List<Produit> getProduitsByCriteria(RemotePagingCriteriasDto<ProduitCriteresRechercheDto> criteres) {
   //     final String select = "SELECT distinct c ";
        /*
         * // Tri croissant par le nom des produits trouvés if (criteres.getListeSorts() == null || criteres.getListeSorts().size() == 0) {
         * criteres.getListeSorts().add(new RemotePagingSortDto("c.nom", true)); } final Query query = createQuery(select, criteres, false); return
         * query.list();
         */
      //  return null;
   // }

    /**
     * {@inheritDoc}
     */
 //   @Override
   // public int countProduitsByCriteria(RemotePagingCriteriasDto<ProduitCriteresRechercheDto> criteres) {
   //     return 0;
        /*
         * final String select = "select count(distinct c.id)"; final Query query = createQuery(select, criteres, true); return
         * Integer.valueOf(query.uniqueResult().toString());
         */

   // }

  //  private Query createQuery(String select, RemotePagingCriteriasDto<ProduitCriteresRechercheDto> criteres, boolean onlyCount) {
  //      return null;
        /*
         * final Map<String, Object> parametres = new HashMap<String, Object>(); String hql = select + " FROM Produit c "; if
         * (criteres.getCriterias().getCommonSearch() != null) { hql += " LEFT JOIN c.telephones t "; hql += " LEFT JOIN c.emails e "; hql +=
         * " LEFT JOIN c.civilite civ "; } if (criteres.getCriterias().getCommonSearch() != null) { hql += " WHERE lower(c.nom) like lower(:value) "; hql +=
         * " OR lower(c.prenom) like lower(:value) "; hql += " OR t.numero like :value "; hql += " OR lower(e.email) like lower(:value) "; hql +=
         * " OR lower(civ.libelle) like lower(:value) "; parametres.put("value", POURCENT + criteres.getCriterias().getCommonSearch() + POURCENT); } else { hql
         * += " WHERE 1=1 "; if (criteres.getCriterias().getNom() != null) { hql += " AND lower(c.nom) like lower(:nom) "; parametres.put("nom", POURCENT +
         * criteres.getCriterias().getNom() + POURCENT); } if (criteres.getCriterias().getPrenom() != null) { hql +=
         * " AND lower(c.prenom) like lower(:prenom) "; parametres.put("prenom", POURCENT + criteres.getCriterias().getPrenom() + POURCENT); } if
         * (criteres.getCriterias().isExclureAnniversaire()) { final Calendar today = Calendar.getInstance(); hql += " AND (month(c.dateNaissance) <> :month";
         * hql += " OR day(c.dateNaissance) <> :day)"; parametres.put("month", today.get(Calendar.MONTH) + 1); parametres.put("day",
         * today.get(Calendar.DAY_OF_MONTH)); } } Query query; if (onlyCount) { query = createQuery(hql); } else { query = createQuery(hql, criteres); }
         * query.setProperties(parametres); return query;
         */
  //  }

}
